Jak naplnit TStrings pomoci DLL?

Otázka od: little_bobes@centrum.cz

7. 7. 2004 7:22

Zdravim,

mam tu problem s DLL, se kterym si nevim rady.
----------------------------------------------------------------------------
Mam definovanou nasledujici strukturu (stejnou strukturu pouziva jak hlavni
program, tak i DLL):
type
  PCommonParams = ^TCommonParams;
  TCommonParams = record
    Fields: TStrings;
    ... // je tu vice promennych
  end;
----------------------------------------------------------------------------
Funkci v knihovne volam z hlavniho programu takto:
var
  CommonParamsPTR: PCommonParams;
  CommonParams: TCommonParams;
...
CommonParams.Fields := TStringList.Create;
CommonParamsPTR := @CommonParams;
...
if DLL_Funkce(CommonParamsPTR, PChar(Error)) then
    ShowMessage(CommonParamsPTR^.Fields.Text)
else
   ShowMessage(Error);
...
   FreeAndNil(CommonParamsPTR^.Fields); // zde ale dochazi k AV
...
----------------------------------------------------------------------------
V DLL plnim Fields takto:
function DLL_Funkce(CommonParams: PCommonParams; Error: PChar): Boolean;
stdcall;
...
        // vyplnim seznam sloupcu a jejich hodnoty
        For loop := 0 to Q1.FieldCount - 1 do
        CommonParams^.Fields.Values[Q1.Fields[loop].FieldName] :=
Q1.Fields[loop].AsString;
...

Promenna Fields v recordu se v DLL spravne naplnila, ale problem nastava
pozdeji, kdyz chci v hlavnim programu zrusit promennou Fields.
Problem je podle me v tom, jak se v DLL vyplnuji Values, ale bohuzel nevim,
jak jinak toto vyresit, protoze potrebuji k textum ve Fields pristupovat
pomoci IndexOf a Values.

Poradite mi nekdo, jak na to? Predem dekuji.

Bob
(D4 c/s, FB 1.5)




Odpovedá: tondrej@t-online.de

7. 7. 2004 8:00

Zdar,

> mam tu problem s DLL, se kterym si nevim rady.
> --------------------------------------------------------------------------
--
> Mam definovanou nasledujici strukturu (stejnou strukturu pouziva jak
> hlavni program, tak i DLL):
> type
> PCommonParams = ^TCommonParams;
> TCommonParams = record
> Fields: TStrings;
> ... // je tu vice promennych
> end;
> --------------------------------------------------------------------------
--
> Funkci v knihovne volam z hlavniho programu takto:
> var
> CommonParamsPTR: PCommonParams;
> CommonParams: TCommonParams;
> ...
> CommonParams.Fields := TStringList.Create;
> CommonParamsPTR := @CommonParams;
> ...
> if DLL_Funkce(CommonParamsPTR, PChar(Error)) then
> ShowMessage(CommonParamsPTR^.Fields.Text)
> else
> ShowMessage(Error);
> ...
> FreeAndNil(CommonParamsPTR^.Fields); // zde ale dochazi k AV

Ak chces do DLL a spet predavat stringy, musis mat v uses obidvoch projektov
(ako prvu) unitu ShareMem.

HTH
TOndrej


Odpovedá: little_bobes@centrum.cz

7. 7. 2004 9:19

Jenze to nepomuze

Bob

> > ...
> > if DLL_Funkce(CommonParamsPTR, PChar(Error)) then
> > ShowMessage(CommonParamsPTR^.Fields.Text)
> > else
> > ShowMessage(Error);
> > ...
> > FreeAndNil(CommonParamsPTR^.Fields); // zde ale dochazi k AV
>
> Ak chces do DLL a spet predavat stringy, musis mat v uses obidvoch
projektov
> (ako prvu) unitu ShareMem.
>




Odpovedá: Jakub Dusek

7. 7. 2004 11:30

TStringList v DLL bez pouziti balicku je jiny nez TStringList v EXE.

Jakub Dusek
----------------------------------------------------------------------
web: http://www.corexpert.com, mobile: +420 604 615 795, ICQ: 86063232
odesilani smsek, vizitek, log a melodii, snadna integrace do Vaseho IS
     => Sms GateKeeper, Sms GateKeeper Service

======================================================================
Wednesday, July 7, 2004, 8:09:56 AM, you wrote:

lcc> CommonParams.Fields := TStringList.Create;